package com.example.finalsystem.Controller;

import com.alibaba.fastjson.JSONArray;
import com.example.finalsystem.Service.BuyService;
import com.example.finalsystem.Service.OutListService;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import java.io.InputStream;

/*
销售管理员可通过该功能对采购清单进行录入、查看操作

*     管理添加采购申请 编写所属的合同号
*     （注意事项 如果要给所有的货物清单中的货物添加采购，需要多次调用添加物资的接口）
*     选择要采购的物资(FK_listGoodsId)，填上采购数量， 后端生成出货单号(一个出货单对应一种物资)
*
*     出货单分两个状态  一个是已分发  一个未分发   状态改变由仓库管理员负责
*
*     若仓库后端发现无此类商品或商品数量不足以支撑购买量或低于商品阀值 则 对应的发货单无法点击  只能使得仓库管理员选择进货
*
*     若仓库后端有此类商品 并且足够 则 对应的发货单发出 对应商品数量减少
*
*     此时 合同发货流程结束
*
* */

/*
*
* 修改，删除采购单
*
* 无
*
* */


/*
*
* 查看采购单
*
* 先通过合同号查询该合同下的分页采购单
*
* 然后通过采购单号 展示对应采购单所有的出货单信息
*
*
*
* */


@RestController
public class BuyController {
    @Autowired
    BuyService buyService;
    @Autowired
    OutListService outListService;

//    批量生成出货单，以便前端请求
private SqlSession openSession()
{
    String resource = "mybatis-config.xml";
    InputStream is = BuyController.class.getClassLoader().getResourceAsStream(resource);
    SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
    return   sessionFactory.openSession(true);
}
    @ResponseBody
    @PostMapping("/buy/addBuyAll")
//    方法说明  通过 前端选取对应合同   购买合同中的货物   生成出货单
//    要求 前端输送  合同编号，
//    采购单信息（经手人（字符串），购买方式（字符串），总价（double））
//    采购物品信息（字符串）
//    参数说明 listGoodsMessage  格式为  货物单号#出货数量;分号间隔     货物单号对应listGoodId
//    dealId 所属合同号   ,
//    totalPrice  采购单总价
//    managePerson 经手人
//    buyMethod  购买方式
    public  String addBuyAll(@RequestParam String dealId, @RequestParam String listGoodsMessage,
                                @RequestParam String managePerson,@RequestParam String buyMethod,
                             @RequestParam Double totalPrice)
    {
        SqlSession sqlSession =openSession();
        Long buyListId = buyService.addBuyList(totalPrice,dealId,buyMethod,managePerson);
        if (buyListId == null)
        {
            return "添加失败";
        }
        int iter =0;
        String[] splitStr = listGoodsMessage.split(";");
        for (String i:splitStr
             ) {
            String[] tmp = i.split("#");
           outListService.addOutList(buyListId, Integer.parseInt(tmp[1]),Long.parseLong(tmp[0]),sqlSession);
           iter++;
        }
        sqlSession.close();
        return "成功添加"+iter+"条记录";
    }



//    生成出货单与采购单   出货单状态为 未发放

    @ResponseBody
    @PostMapping("/buy/addBuy")
    public String addBuy(@RequestParam Integer exportNumber,@RequestParam  Long FK_listGoodsId,
                         @RequestParam  double totalPrice,@RequestParam  String dealId,
                         @RequestParam String buyMethod,@RequestParam String managerPerson)
    {
        SqlSession sqlSession  = openSession();
        Long Id = buyService.addBuyList(totalPrice,dealId,buyMethod,managerPerson);
        String str = outListService.addOutList(Id,exportNumber,FK_listGoodsId,sqlSession);
        sqlSession.close();
        return str;

    }
//  获取采购单上的出货单
    @ResponseBody
    @PostMapping("/buy/getAllOutListByBuyList")
    public String getAllOutListByBuyList(@RequestParam Long buyListId)
    {
       return JSONArray.toJSONString( outListService.getAllOutListByBuyListId(buyListId));
    }


    @ResponseBody
    @PostMapping("/buy/getListOfBuyList")
    public String getListOfBuy(@RequestParam String dealId,@RequestParam int currentPage,@RequestParam int pageSize)
    {
        return JSONArray.toJSONString(buyService.getListOfBuyList(dealId,currentPage,pageSize));
    }


    @ResponseBody
    @PostMapping("/buy/countBuyList")
    public String countBuyList(@RequestParam String dealId)
    {
        return ""+buyService.countBuyList(dealId);
    }

//    查看仓库中是否有存货，  若没有存货仓库管理员无法进行出货

}
